import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
import Qs from 'qs'
import configs from 'configs';

const gbs = configs.settings.gbs;
Vue.use(VueAxios, axios);
//  axios.defaults.withCredentials=true;
// 动态设置本地和线上接口域名
Vue.axios.defaults.baseURL = gbs.host;

// 判断obj时候为空
const isEmptyObject = (e) => {
  var t;
  for (t in e) {
    return !1;
  }
  return !0
}

/**
 * API请求函数封装
 * ---------------------------------------------------------
 * 所有请求函数通过统一的定义的参数进行调用
 *
 * @param    {string}    type        请求类型
 * @param    {string}    path        请求初始路由
 * @param    {object}    data        请求参数
 * @param    {object}    restfulReq  请求参数(restful形式)
 * @param    {function}  fn          请求结束回掉函数
 * @param    {function}  succFn      请求结束正常回掉函数
 * @param    {function}  errFn       请求结束错误函数
 * @param    {boolean}   tokenFlag   是否需要带token用户验证值
 * @param    {boolean}   noLoading   是否需要显示动画加载
 * @param    {object}    headers     请求头重定义
 * @param    {object}    opts        axios参数重定义
 * @returns  void
 *
 * @date     2018-05-12
 * @author   JAMES<1071714548@qq.com>
 */

export default function ({ type, path, data, restfulReq, fn, succFn, errFn, tokenFlag, noLoading, headers, opts } = {}) {
  const options = {
    method: type,
    headers: headers || {
      'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8'
    },
  };
  if (path.indexOf('/:') > 0 && JSON.stringify(restfulReq) !== '{}') {
    for (var i in restfulReq) {
      options.url = path.replace(':' + i, restfulReq[i])
    }
  } else {
    options.url = path
  }
  options[type === 'get'  ? 'params' : 'data'] = data; // Qs.stringify(data);
  options[type === 'post' ? 'data'   : 'data'] = Qs.stringify(data);
  // 分发显示加载样式任务
  if (!noLoading) {
    this && this.$store.dispatch('show_loading');
  }

  //  axios内置属性均可写在这里
  if (opts && typeof opts === 'object') {
    for (var f in opts) {
      options[f] = opts[f];
    }
  }
  Vue.axios(options).then(res => {
    this.$store && this.$store.dispatch('hide_loading');
    fn && fn(res.data);

    if (res.data.code === 1) {
      succFn && succFn(res.data.data);
    } else if (res.data.code == '1001' || res.data.code == '1000') {
    } else {
      // Vue.$toast(res.data.msg)
    }
  }).catch((err) => {

    this.$store && this.$store.dispatch('hide_loading');
    // this.$message({
    //   message: '后台服务器错误',
    //   type: 'warning'
    // })
    errFn && errFn(err.data);
  });
}
